/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package repositorio;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import infra.InterfaceDao;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import modelo.Cliente;
import servicos.*;

/**
 *
 * @author Edemilson Danker
 * @author Jefferson Sidney Rossetim
 * @author Rogerio Mello Vanti
 */
public class ClientesDao implements InterfaceDao{
    
    private File arquivo;
    private EncriptaBlowFish cripto;
    private RSA rsa;
       
    public ClientesDao() throws IOException{
        this.arquivo = new File("Clientes.dat");
        cripto = new EncriptaBlowFish();
        rsa = new RSA();
        
    }//fim construtor vazio
    
    public ClientesDao(File arquivo){
        this.arquivo = arquivo;
        cripto = new EncriptaBlowFish();
        rsa = new RSA();
    }//fim construtor 
   

    @Override
    public boolean verificarArquivo() {
        return this.arquivo.exists();
    }

   @Override
    public void escrever(List lista) throws FileNotFoundException, IOException {
        System.out.println("Escrevendo arquivo de clientes");
        FileOutputStream fluxo = new FileOutputStream(this.arquivo);
        ObjectOutputStream os = new ObjectOutputStream(fluxo);
        os.writeObject(lista);
        os.close();
        fluxo.close();
    }
    
    public void escreverEmTexto(List<Cliente> lista) throws FileNotFoundException, IOException {
        FileOutputStream fluxo = new FileOutputStream(this.arquivo);
        PrintWriter pw = new PrintWriter(fluxo);       
        for(Cliente cliente : lista){            
            String nome = cliente.getNome();
            String cpfCrypted = cripto.encryptBlowfish(cliente.getCpf(), cliente.getNome());
            String nrCartao = cliente.getNumeroCartao();
            try {
                nrCartao = rsa.decifrarRSA(nrCartao, cliente.getChavePrivadaRSA());
            } catch (Exception ex) {
                Logger.getLogger(ClientesDao.class.getName()).log(Level.SEVERE, null, ex);
            }
                        
            pw.println(nome +";" +cpfCrypted+";"+nrCartao);            
        }//fim for
        pw.close();
        fluxo.close();          
    }
    
    public List<Cliente> lerDoTexto() throws FileNotFoundException, IOException{
        List<Cliente> listaPessoas = new ArrayList();
        FileReader fr = new FileReader(this.arquivo);
        BufferedReader buffer = new BufferedReader(fr);
        String linha = null;   
        String[] split = null;
        Cliente c = null;
        
        do{
            linha = buffer.readLine();
            if(linha != null){
                split = linha.split(";");         
                c = new Cliente();
                KeyPair parChaves = null;                
                try {
                    parChaves = rsa.gerarParChaves();
                } catch (Exception ex) {
                    Logger.getLogger(ClientesDao.class.getName()).log(Level.SEVERE, null, ex);
                }
                c.setChavePrivadaRSA(parChaves.getPrivate());
                                
                
                String nome = split[0];
                String cpf = split[1];
                String nrCartao = split[2];
                try {
                    nrCartao = rsa.crifrarRSA(nrCartao, parChaves.getPublic());
                } catch (Exception ex) {
                    Logger.getLogger(ClientesDao.class.getName()).log(Level.SEVERE, null, ex);
                } 
                
                
                c.setNome(nome);
                cpf = cripto.decryptBlowfish(cpf, nome);
                c.setCpf(cpf);               
                c.setNumeroCartao(nrCartao);   

                listaPessoas.add(c);
                
            }//fim if
        }while(linha != null);
        return listaPessoas; 
    }//fim lerDoTexto 

    @Override
    public List ler() throws FileNotFoundException, IOException, ClassNotFoundException {
      System.out.println("Lendo arquivo de clientes");
        List<Cliente> listaPessoas = null;
        FileInputStream fluxo = new FileInputStream(this.arquivo);
        ObjectInputStream oi = new ObjectInputStream(fluxo);
        listaPessoas = (List<Cliente>)oi.readObject();
        oi.close();
        fluxo.close();
        return listaPessoas;
    }
    
}//fim class
